package Controllers;

import Controllers.exceptions.NonexistentEntityException;
import Entities.HdChamados;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Entities.HdEquipamento;
import Entities.HdTipoProblema;
import Entities.HdUsers;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author Ferrari
 */
public class HdChamadosJpaController implements Serializable {

    public HdChamadosJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(HdChamados hdChamados) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            HdEquipamento coEquipamento = hdChamados.getCoEquipamento();
            if (coEquipamento != null) {
                coEquipamento = em.getReference(coEquipamento.getClass(), coEquipamento.getCoEquipamento());
                hdChamados.setCoEquipamento(coEquipamento);
            }
            HdTipoProblema coTipoProblema = hdChamados.getCoTipoProblema();
            if (coTipoProblema != null) {
                coTipoProblema = em.getReference(coTipoProblema.getClass(), coTipoProblema.getCoTipoProblema());
                hdChamados.setCoTipoProblema(coTipoProblema);
            }
            HdUsers coUserResp = hdChamados.getCoUserResp();
            if (coUserResp != null) {
                coUserResp = em.getReference(coUserResp.getClass(), coUserResp.getCoUser());
                hdChamados.setCoUserResp(coUserResp);
            }
            em.persist(hdChamados);
            if (coEquipamento != null) {
                coEquipamento.getHdChamadosList().add(hdChamados);
                coEquipamento = em.merge(coEquipamento);
            }
            if (coTipoProblema != null) {
                coTipoProblema.getHdChamadosList().add(hdChamados);
                coTipoProblema = em.merge(coTipoProblema);
            }
            if (coUserResp != null) {
                coUserResp.getHdChamadosList().add(hdChamados);
                coUserResp = em.merge(coUserResp);
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(HdChamados hdChamados) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            HdChamados persistentHdChamados = em.find(HdChamados.class, hdChamados.getCoChamado());
            HdEquipamento coEquipamentoOld = persistentHdChamados.getCoEquipamento();
            HdEquipamento coEquipamentoNew = hdChamados.getCoEquipamento();
            HdTipoProblema coTipoProblemaOld = persistentHdChamados.getCoTipoProblema();
            HdTipoProblema coTipoProblemaNew = hdChamados.getCoTipoProblema();
            HdUsers coUserRespOld = persistentHdChamados.getCoUserResp();
            HdUsers coUserRespNew = hdChamados.getCoUserResp();
            if (coEquipamentoNew != null) {
                coEquipamentoNew = em.getReference(coEquipamentoNew.getClass(), coEquipamentoNew.getCoEquipamento());
                hdChamados.setCoEquipamento(coEquipamentoNew);
            }
            if (coTipoProblemaNew != null) {
                coTipoProblemaNew = em.getReference(coTipoProblemaNew.getClass(), coTipoProblemaNew.getCoTipoProblema());
                hdChamados.setCoTipoProblema(coTipoProblemaNew);
            }
            if (coUserRespNew != null) {
                coUserRespNew = em.getReference(coUserRespNew.getClass(), coUserRespNew.getCoUser());
                hdChamados.setCoUserResp(coUserRespNew);
            }
            hdChamados = em.merge(hdChamados);
            if (coEquipamentoOld != null && !coEquipamentoOld.equals(coEquipamentoNew)) {
                coEquipamentoOld.getHdChamadosList().remove(hdChamados);
                coEquipamentoOld = em.merge(coEquipamentoOld);
            }
            if (coEquipamentoNew != null && !coEquipamentoNew.equals(coEquipamentoOld)) {
                coEquipamentoNew.getHdChamadosList().add(hdChamados);
                coEquipamentoNew = em.merge(coEquipamentoNew);
            }
            if (coTipoProblemaOld != null && !coTipoProblemaOld.equals(coTipoProblemaNew)) {
                coTipoProblemaOld.getHdChamadosList().remove(hdChamados);
                coTipoProblemaOld = em.merge(coTipoProblemaOld);
            }
            if (coTipoProblemaNew != null && !coTipoProblemaNew.equals(coTipoProblemaOld)) {
                coTipoProblemaNew.getHdChamadosList().add(hdChamados);
                coTipoProblemaNew = em.merge(coTipoProblemaNew);
            }
            if (coUserRespOld != null && !coUserRespOld.equals(coUserRespNew)) {
                coUserRespOld.getHdChamadosList().remove(hdChamados);
                coUserRespOld = em.merge(coUserRespOld);
            }
            if (coUserRespNew != null && !coUserRespNew.equals(coUserRespOld)) {
                coUserRespNew.getHdChamadosList().add(hdChamados);
                coUserRespNew = em.merge(coUserRespNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = hdChamados.getCoChamado();
                if (findHdChamados(id) == null) {
                    throw new NonexistentEntityException("The hdChamados with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            HdChamados hdChamados;
            try {
                hdChamados = em.getReference(HdChamados.class, id);
                hdChamados.getCoChamado();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The hdChamados with id " + id + " no longer exists.", enfe);
            }
            HdEquipamento coEquipamento = hdChamados.getCoEquipamento();
            if (coEquipamento != null) {
                coEquipamento.getHdChamadosList().remove(hdChamados);
                coEquipamento = em.merge(coEquipamento);
            }
            HdTipoProblema coTipoProblema = hdChamados.getCoTipoProblema();
            if (coTipoProblema != null) {
                coTipoProblema.getHdChamadosList().remove(hdChamados);
                coTipoProblema = em.merge(coTipoProblema);
            }
            HdUsers coUserResp = hdChamados.getCoUserResp();
            if (coUserResp != null) {
                coUserResp.getHdChamadosList().remove(hdChamados);
                coUserResp = em.merge(coUserResp);
            }
            em.remove(hdChamados);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<HdChamados> findHdChamadosEntities() {
        return findHdChamadosEntities(true, -1, -1);
    }

    public List<HdChamados> findHdChamadosEntities(int maxResults, int firstResult) {
        return findHdChamadosEntities(false, maxResults, firstResult);
    }

    private List<HdChamados> findHdChamadosEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(HdChamados.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public HdChamados findHdChamados(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(HdChamados.class, id);
        } finally {
            em.close();
        }
    }

    public int getHdChamadosCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<HdChamados> rt = cq.from(HdChamados.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            q.setHint("eclipselink.cache-usage", "DoNotCheckCache");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
    public List<HdChamados> findHdChamadosByCoUser(HdUsers user){
        EntityManager em = getEntityManager();
        
         List<HdChamados> list = em.createNamedQuery(HdChamados.findByUser , HdChamados.class)
            .setParameter("coUserResp", user)
            .getResultList();
         
         if(list.size() > 0){
             return list;
         }else{
             return null;
         }
    }
    
}
